﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Config.Enum;
using HighLowBase;
using HighLowTriple7;
using HighLowTriple7.Entity;
using PaymentBLL;
using WebTriple7.Class;

namespace WebTriple7.Service
{
    /// <summary>
    /// Thao tác với game
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class WSGame : System.Web.Services.WebService
    {
        [WebMethod(EnableSession = true)]
        public BetGameResult BetItem(int type,
            int bet,
            int hi,
            int col, int gateWayId=0)
        {
            var retVal1 = new BetGameResult()
            {
                Info = new Triple7SessionInfo(),
                Rate = new RateConfigEntity(),
                Success = false,
                Mess = "Có lỗi xảy ra",
                Result = 0
            };
            try
            {
                if (type > 0)
                {
                    retVal1 = BetGame(bet, type, gateWayId);
                }
                else
                {
                    retVal1 = Choose(col, hi);

                }
            }
            catch (Exception e)
            {
                retVal1.Mess = e.Message;
            }
            return retVal1;
        }
       

        /// <summary>
        /// Đặt cược
        /// </summary>
        /// <param name="money"></param>
        /// <param name="typeBet"></param>
        /// <returns></returns>
        [WebMethod(EnableSession = true)]
        public BetGameResult BetGame(int money, int typeBet, int gateWayId)
        {
            var retVal1 = new BetGameResult()
                              {
                                  Info = new Triple7SessionInfo(),
                                  Rate = new RateConfigEntity(),
                                  Success = false,
                                  Mess = "Có lỗi xảy ra",
                                  Result = 0
                              };

            //sai loại cược
            if (typeBet != 1 && typeBet != 2)
            {
                retVal1.Success = false;
                retVal1.Mess = "Không thể lấy thông tin đặt cược";
                return retVal1;
            }
            //Chưa đăng nhập
            if (!Utils.UserUtils.IsLogin)
            {
                retVal1.Success = false;
                retVal1.Mess = "Bạn đã hết phiên đăng nhập, mời bạn thử lại sau";
                retVal1.Result = -1;
                return retVal1;
            }

            int accountId = Utils.UserUtils.AccountId;
            string accessToken = Utils.UserUtils.Triple7AccessToken;

            
            var gameInfo = Triple7.GetGameInfo(accessToken);// HiLoGame.LoadGameInfo((int)Config.Enum.GameType.Triple7);
            if (money < gameInfo.MinimumBet || money > gameInfo.MaximumBet)
            {
                retVal1.Success = false;
                retVal1.Mess = "Số " + (typeBet == 1 ? "vàng" : "bạc") + " đặt cược phải nằm trong khoảng " + gameInfo.MinimumBet + "-" + gameInfo.MaximumBet;
                return retVal1;
            }

            //Kiểm tra số dư có đủ đặt cược hay không
            var ctr = new CtrAccount();
            var infoAcc = ctr.SelectAccountInfo(accountId);
            //Cược bằng vàng
            if (typeBet == 1)
            {

                if (money > infoAcc.Au)
                {
                    var gateWay = (GateWay)gateWayId;
                    var gatePayment = new GateWayPayment(gateWay);
                    var gate = gatePayment.GetGateWayInfo();
                    var money1 = money - infoAcc.Au;

                    var amount = (Int32)Math.Round(money1 * gate.AmountIn / gate.ReceiveAu, 0);
                    var au = (Int32)Math.Round(amount * gate.ReceiveAu / gate.AmountIn, 0);

                    retVal1.Success = false;
                    //100|vcoin|150|100
                    //số vcoin/gosu cần thanh toán|đơn vị|số vàng đặt|số vàng nhận được
                    retVal1.Mess = amount+"|"+gate.Unit + "|" + money + "|" + au;

                    retVal1.Result = -100;                    
                    return retVal1;
                }
            }
            //Cược bằng bạc
            if (typeBet == 2)
            {
                if (money > infoAcc.Ag)
                {
                    retVal1.Success = false;
                    retVal1.Mess = "Tài khoản của bạn không đủ để đặt cược";
                    return retVal1;
                }
            }

            //Trả về lỗi nếu game đang chơi
            if (Triple7.GetGameStatus(accessToken) == 5)
            {
                retVal1.Success = false;
                retVal1.Mess = "Đang tồn tại phiên";
                return retVal1;
            }

            //Đặt cược        
            if (typeBet == 1)
                Triple7.PlayerBetAu(money, accessToken);
            if (typeBet == 2)
                Triple7.PlayerBetAg(money, accessToken);

            //Nếu đặt cược không thành công
            if (Triple7.GetGameStatus(accessToken) == 4)
            {
                retVal1.Success = false;
                retVal1.Mess = "Lỗi kết nối tới máy chủ";
                return retVal1;
            }

            //Lấy các thông số hiện tại của phiên                  
            retVal1.Info = Triple7.GetSessionInfo(accessToken);
            retVal1.Rate = Triple7.GetRateConfig(retVal1.Info.AuCurrent + retVal1.Info.AgCurrent, accessToken);
            retVal1.Success = true;
            retVal1.Mess = "Thành công";            
            return retVal1;
        }
        /// <summary>
        /// Chọn Hi/Lo
        /// </summary>
        /// <param name="col"></param>
        /// <param name="hi"></param>
        /// <returns></returns>
        [WebMethod(EnableSession = true)]
        public BetGameResult Choose(int col, int hi)
        {
            var retVal1 = new BetGameResult()
                              {
                                  Info = new Triple7SessionInfo(),
                                  Rate = new RateConfigEntity(),
                                  Success = false,
                                  Mess = "Có lỗi xảy ra"
                              };
            //Chưa đăng nhập
            if (!Utils.UserUtils.IsLogin)
            {
                retVal1.Success = false;
                retVal1.Mess = "Bạn đã hết phiên đăng nhập, vui lòng thử lại sau";
                retVal1.Result = -1;
                return retVal1;
            }

            string accessToken = Utils.UserUtils.Triple7AccessToken;
            //Nếu chưa có phiên nào chạy
            if (Triple7.GetGameStatus(accessToken) == 4)
            {
                retVal1.Success = false;
                retVal1.Mess = "Bạn chưa đặt cược";
                return retVal1;
            }

            if(col==0)//Chọn Shuffle
            {
                Triple7.PlayerSelectNudges(accessToken);                
            }
            else//Lựa chọn giá trị
            {
                //Lựa chọn
                if (hi > 0)
                    Triple7.PlayerSelectHigh(col, accessToken);
                else
                    Triple7.PlayerSelectLow(col, accessToken);               
            }
            

            //Lấy các thông số hiện tại của phiên            
            retVal1.Info = Triple7.GetSessionInfo(accessToken);
            retVal1.Rate = Triple7.GetRateConfig(retVal1.Info.AuCurrent + retVal1.Info.AgCurrent, accessToken);
            retVal1.Success = true;
            retVal1.Mess = "Thành công";
            if(col==0)
                retVal1.Result = 0;
            else
                retVal1.Result = (retVal1.Info.AuCurrent + retVal1.Info.AgCurrent) > 0 ? 1 : -1;
                
            
            return retVal1;
        }

        /// <summary>
        /// Thu tiền
        /// </summary>
        /// <returns></returns>
        [WebMethod(EnableSession = true)]
        public string Collect()
        {

            if (!Utils.UserUtils.IsLogin)
            {
                return "-1|Bạn chưa đăng nhập";
            }
            string accessToken = Utils.UserUtils.Triple7AccessToken;
            if (Triple7.GetGameStatus(accessToken) == 4)
            {
                return "-3|Bạn chưa đặt cược";
            }
            if (Triple7.GetRound(accessToken) < 1)
            {
                return "-4|Bạn chưa chơi vòng nào";
            }

            Triple7.PlayerCollect(accessToken);
            if (Triple7.GetGameStatus(accessToken) == 4)
            {
                return "1|Thành công";
            }

            return "0|Có lỗi xảy ra";
        }

    }
    /// <summary>
    /// Thông số game trả về
    /// </summary>
    public class BetGameResult
    {
        public bool Success { get; set; }
        public string Mess { get; set; }
        public RateConfigEntity Rate { get; set; }
        public Triple7SessionInfo Info { get; set; }
        public int Result { get; set; }//-1: Game Over, 0: None, 1: Win
        public string UrlGetCode
        {
            get { return string.Format(Config.Global.Settings.GET_CODE_URL, Config.Global.Settings.CLIENT_ID); }
        }
    }
    
}
